home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / socks.nasl < prev    next >
Text File  |  2005-03-31  |  5KB  |  191 lines

  1. #
  2. # This script was written by Michel Arboi <arboi@alussinan.org>
  3. # GPL
  4. # Socks4 protocol is described on 
  5. # http://www.socks.nec.com/protocol/socks4.protocol
  6. # Socks4a extension is described on 
  7. # http://www.socks.nec.com/protocol/socks4a.protocol
  8. # Socks5 is defined by those RFC:
  9. # RFC1928 SOCKS Protocol Version 5
  10. # RFC1929 Username/Password Authentication for SOCKS V5
  11. # RFC1961 GSS-API Authentication Method for SOCKS Version 5
  12. #
  13.  
  14.  
  15. if(description)
  16. {
  17.  script_id(11865);
  18.  script_version ("$Revision: 1.3 $");
  19. #script_cve_id("CVE-MAP-NOMATCH");
  20.  name["english"] = "SOCKS server detection";
  21.  script_name(english:name["english"]);
  22.  
  23.  desc["english"] = "
  24. A SOCKS server is running on this host
  25.  
  26. Risk factor : None";
  27.  
  28.  script_description(english:desc["english"]);
  29.  
  30.  summary["english"] = "Detect & inspect SOCKS4/5 servers";
  31.  script_summary(english:summary["english"]);
  32.  
  33.  script_category(ACT_GATHER_INFO);
  34.  
  35.  script_copyright(english:"This script is Copyright (C) 2002 Michel Arboi");
  36.  family["english"] = "Misc.";
  37.  family["francais"] = "Divers";
  38.  script_family(english:family["english"], francais:family["francais"]);
  39.  script_require_ports("Services/socks", 1080);
  40.  script_dependencie("find_service.nes", "find_service2.nasl");
  41.  #script_add_preference(name: "Quick SOCKS proxy checking", type:"checkbox", value:"no");
  42.  exit(0);
  43. }
  44.  
  45. ########
  46.  
  47. include("misc_func.inc");
  48.  
  49. function mark_socks_proxy(port, ver, ext_ip, authm)
  50. {
  51.   local_var    rep;
  52.  
  53.   #display("ver=", ver, "\text_ip=", ext_ip, "\tauth=", authm, "\n");
  54.   register_service(port: port, proto: "socks"+ver);
  55.   rep = strcat('A SOCKS', ver, ' server is running on this port\n');
  56.   if (ext_ip)
  57.     rep = strcat(rep, 'Its external interface address is ', ext_ip, '\n');
  58.   else
  59.     rep = strcat(rep, 'We could not determine its external interface address\n');
  60.   if (! isnull(authm))
  61.   {
  62.     set_kb_item(name: "socks"+ver+"/auth/"+port, value: authm);
  63.     if (authm == 0)
  64.       rep = strcat(rep, 'It does not require authentication, or does not implement it.\n');
  65.     else if (authm == 1)
  66.       rep = strcat(rep, 'It prefers the username/password authentication.\n');
  67.     else if (authm == 2)
  68.       rep = strcat(rep, 'It prefers the GSS API authentication.\n');
  69.     else if (authm == 255)
  70.       rep = strcat(rep, 'It rejected all standard authentication methods (none, password, GSS API).\n');
  71.     else
  72.       rep = strcat(rep, 'It prefers the unknown ', authm, ' authentication method (bug?)\n');
  73.   }
  74.   security_note(port: port, data: rep);
  75. }
  76.  
  77. function test_socks(port)
  78. {
  79.   # No need to declare local vars in this function
  80.   soc = open_sock_tcp(port);
  81.   if(! soc) return;
  82.  
  83. #
  84. # SOCKS4 request: 
  85. # 1    Version number (4)
  86. # 1    Command (1: connect / 2: bind)
  87. # 2    Port
  88. # 4    Address
  89. # Var    UserID
  90. # 1    zero (0)
  91. #
  92. # Bind: (local) port = 65535; expected remote address = 10.10.10.10
  93.   req4 = raw_string(4, 2, 255, 255, 10, 10, 10, 10);
  94.   req4 += "root";
  95.   req4 += raw_string(0);
  96.   send(socket: soc, data: req4);
  97.   data = recv(socket: soc, length: 8);
  98.   if (strlen(data) == 8)
  99.   {
  100. # SOCKS4 answer:
  101. # 1    version (0)
  102. # 1    code (90 -> 92)
  103. # 2    port (or 0)
  104. # 4    IP (or 0)
  105.     if (ord(data[0]) == 0 && ord(data[1]) >= 90 && ord(data[1]) <= 93)
  106.     {
  107.       # Looks like a SOCKS4 server
  108.       if (ord(data[1]) == 90)
  109.       {
  110.         ext = strcat(ord(data[4]), '.', ord(data[5]), '.', ord(data[6]), '.', ord(data[7]));
  111.       }
  112.       else
  113.         exp = NULL;
  114.       mark_socks_proxy(port: port, ver: 4, ext_ip: ext);
  115.     }
  116.   }
  117.   close(soc);
  118. ######
  119. #  SOCKS5 connection: 
  120. #  1    Version number (5)
  121. #  1    # of auth methods 
  122. #  Var    Array of methods:
  123. #    1    Method number:    0: no auth
  124. #                1: GSSAPI
  125. #                2: password 
  126. #                3-7F: IANA reserved,
  127. #                80-FE: user reserved
  128. #                FF: no method 
  129. # We should announce at least GSS API to be RFC conformant.
  130. #
  131. # The server answers:
  132. # 1    Version
  133. # 1    Chosen method (or FF if failure)
  134. #
  135.   soc = open_sock_tcp(port);
  136.   if (!soc) return;
  137.   req5 = raw_string(5, 3, 0, 1, 2);
  138.   send(socket: soc, data: req5);
  139.   data = recv(socket: soc, length: 2);
  140.   if (strlen(data) == 2)
  141.   {
  142.     if (ord(data[0]) == 5 && (ord(data[1]) <= 2 || ord(data[1] == 255)))
  143.     {
  144.       authm = ord(data[1]);
  145.       # Really looks like a SOCKS5 server
  146.       req5 = raw_string(5, 2, 0, 1, 10, 10, 10, 10, 255, 255);    # BIND
  147.       send(socket: soc, data: req5);
  148.       data = recv(socket: soc, length: 10);
  149.       if (ord(data[1]) != 0 || ord(data[3]) != 1)
  150.         ext = NULL;
  151.       else
  152.         ext = strcat(ord(data[4]), '.', ord(data[5]), '.', ord(data[6]), '.', ord(data[7]));
  153.       mark_socks_proxy(port: port, ver: 5, ext_ip: ext, authm: authm);
  154.     }
  155.   }
  156. }
  157.  
  158. quick_check = 0;
  159. #q = script_get_preference("Quick SOCKS proxy checking");
  160. #quick_check =  (q == "yes");
  161.  
  162. s = get_kb_list("Services/socks4");
  163. if(!isnull(s))s = make_list(s);
  164. else s = make_list();
  165.  
  166. s2 =  get_kb_list("Services/socks5");
  167. if(!isnull(s2))s2 = make_list(s2);
  168. else s2 = make_list();
  169.  
  170. s3 = get_kb_list("Services/unknown");
  171. if(!isnull(s3)) s3 = make_list(s3);
  172. else s3 = make_list();
  173.  
  174. ports = make_list(1080, s, s2);
  175. if (! quick_check)
  176.   ports = make_list(ports,s3);
  177.  
  178. prev_port = 0;
  179. ports = sort(ports);
  180.  
  181. foreach port (ports)
  182.   if(port != prev_port)
  183.   {
  184.     prev_port = port;
  185.     if (get_port_state(port) && service_is_unknown(port: port))
  186.       test_socks(port: port);
  187.   }
  188.  
  189.  
  190.